/**
 * 
 */
package edu.acatlan.unam.shared.bdoo;

//Librerías de la clase
import java.io.Serializable;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

/**
 * @author jacobo
 * Esta clase encapsula los elementos necesarios para generar una
 * columna básica. Además almacena la información referente a si forma
 * parte de la llave privada y sus restricciones (es única, permite
 * nulos, es llave foránea o si es índice).
 */
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TColumna implements Serializable, ModeloRelacional {
	//Propiedades de la clase
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long idColumna;
	@Persistent
	private String nombreCol;
	@Persistent
	private Long idTabla;
	@Persistent
	private String tipoDato;
	@Persistent
	private Boolean esLlave;
	@Persistent
	private Boolean esForanea;
	@Persistent
	private Boolean permiteNulo;
	@Persistent
	private Boolean esUnico;
	@Persistent
	private Boolean esIndice;
	@Persistent
	private String valDefault;
	@Persistent
	private Integer orden;
	
	/**
	 * Constructor de la clase por default
	 */
	public TColumna() {
		
	}
	
	/**
	 * @param nombreCol es el nombre de la columna
	 * @param idTabla es el identificador de la tabla a la que pertenece
	 * @param tipoDato es el tipo de dato que almacena
	 * @param esLlave indica si es llave primaria
	 * @param esForanea indica si es llave foránea
	 * @param permiteNulo indica si permite nulos
	 * @param esUnico indica si es único
	 * @param esIndice indica si es índice
	 * @param valDefault indica el valor por default
	 * @param orden indica el lugar que ocupa la columna
	 */
	public TColumna(String nombreCol, Long idTabla, String tipoDato,
			Boolean esLlave, Boolean esForanea, Boolean permiteNulo,
			Boolean esUnico, Boolean esIndice, String valDefault, Integer orden) {
		this.nombreCol = nombreCol;
		this.idTabla = idTabla;
		this.tipoDato = tipoDato;
		this.esLlave = esLlave;
		this.esForanea = esForanea;
		this.permiteNulo = permiteNulo;
		this.esUnico = esUnico;
		this.esIndice = esIndice;
		this.valDefault = valDefault;
		this.orden = orden;
	}

	/**
	 * @return the idColumna
	 */
	public Long getIdColumna() {
		return idColumna;
	}

	/**
	 * @param idColumna the idColumna to set
	 */
	public void setIdColumna(Long idColumna) {
		this.idColumna = idColumna;
	}

	/**
	 * @return the nombreCol
	 */
	public String getNombreCol() {
		return nombreCol;
	}

	/**
	 * @param nombreCol the nombreCol to set
	 */
	public void setNombreCol(String nombreCol) {
		this.nombreCol = nombreCol;
	}

	/**
	 * @return the idTabla
	 */
	public Long getIdTabla() {
		return idTabla;
	}

	/**
	 * @param idTabla the idTabla to set
	 */
	public void setIdTabla(Long idTabla) {
		this.idTabla = idTabla;
	}

	/**
	 * @return the tipoDato
	 */
	public String getTipoDato() {
		return tipoDato;
	}

	/**
	 * @param tipoDato the tipoDato to set
	 */
	public void setTipoDato(String tipoDato) {
		this.tipoDato = tipoDato;
	}

	/**
	 * @return the perNulo
	 */
	public Boolean getPermiteNulo() {
		return permiteNulo;
	}

	/**
	 * @param perNulo the perNulo to set
	 */
	public void setPermiteNulo(Boolean permiteNulo) {
		this.permiteNulo = permiteNulo;
	}

	/**
	 * @return the esUnico
	 */
	public Boolean getEsUnico() {
		return esUnico;
	}

	/**
	 * @param esUnico the esUnico to set
	 */
	public void setEsUnico(Boolean esUnico) {
		this.esUnico = esUnico;
	}

	/**
	 * @return the esIndice
	 */
	public Boolean getEsIndice() {
		return esIndice;
	}

	/**
	 * @param esIndice the esIndice to set
	 */
	public void setEsIndice(Boolean esIndice) {
		this.esIndice = esIndice;
	}

	/**
	 * @return the valDefault
	 */
	public String getValDefault() {
		return valDefault;
	}

	/**
	 * @param valDefault the valDefault to set
	 */
	public void setValDefault(String valDefault) {
		this.valDefault = valDefault;
	}

	/**
	 * @return the esLlave
	 */
	public Boolean getEsLlave() {
		return esLlave;
	}

	/**
	 * @param esLlave the esLlave to set
	 */
	public void setEsLlave(Boolean esLlave) {
		this.esLlave = esLlave;
	}

	/**
	 * @return the esForanea
	 */
	public Boolean getEsForanea() {
		return esForanea;
	}

	/**
	 * @param esForanea the esForanea to set
	 */
	public void setEsForanea(Boolean esForanea) {
		this.esForanea = esForanea;
	}

	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ModeloRelacional#getCadenaDLL()
	 */
	public String getCadenaDLL() {
		String c = "`" + nombreCol + "` " +
		this.tipoDato.toUpperCase();
		
		if(!permiteNulo)
			c += " NOT";
		c += " NULL";
		
		if(!valDefault.isEmpty())
			c += " DEFAULT '" + valDefault +"'";
		
		return c;
	}

	/**
	 * @return the orden
	 */
	public Integer getOrden() {
		return orden;
	}

	/**
	 * @param orden the orden to set
	 */
	public void setOrden(Integer orden) {
		this.orden = orden;
	}
	
}
